﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using NoeticTools.NWorkflow.DotNetInterop;


namespace NoeticTools.NWorkflow.Steps.Gates
{
    /// <summary>
    ///     Invoke a synchronous function and only use the returned result if the invoking step is still active.
    /// </summary>
    public class SynchronousFunctionGate<TResult, TStepResult>
    {
        private readonly Func<TStepResult> _func;

        public SynchronousFunctionGate(Func<TStepResult> func)
        {
            _func = func;
        }

        public void Invoke(IWorkflowRunner<TResult> workflowRules)
        {
            var stepOnInvoke = workflowRules.CurrentStep;
            var result = _func();

            lock (workflowRules.SyncRoot)
            {
                if (ReferenceEquals(stepOnInvoke, workflowRules.CurrentStep))
                {
                    stepOnInvoke.SetResult(result);
                }
            }
        }
    }
}